//
//  SubjectsVariablesViewController.swift
//  iOS-RxSwift-Tutorials_Example
//
//  Created by mengru.tian on 2020/9/17.
//  Copyright © 2020 CocoaPods. All rights reserved.
//

import UIKit
import RxSwift
import RxRelay

// 5.Subjects、Variables
class SubjectsVariablesViewController: UIViewController {
    
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.title = "Observer - 自定义可绑定属性"
        self.view.backgroundColor = UIColor.white
        
        // testPublishSubject()
        // testBehaviorSubject()
        // testReplaySubject()
        // testVariable()
        // testReplaySubject()
        testBehaviorRelay()
    }

    // 测试PublishSubject
    func testPublishSubject() {
         
        // 创建一个PublishSubject
        let subject = PublishSubject<String>()
         
        // 由于当前没有任何订阅者，所以这条信息不会输出到控制台
        subject.onNext("111")
         
        // 第1次订阅subject
        subject.subscribe(onNext: { string in
            print("第1次订阅：", string)
        }, onCompleted:{
            print("第1次订阅：onCompleted")
        }).disposed(by: disposeBag)
         
        // 当前有1个订阅，则该信息会输出到控制台
        subject.onNext("222")
         
        // 第2次订阅subject
        subject.subscribe(onNext: { string in
            print("第2次订阅：", string)
        }, onCompleted:{
            print("第2次订阅：onCompleted")
        }).disposed(by: disposeBag)
         
        // 当前有2个订阅，则该信息会输出到控制台
        subject.onNext("333")
         
        // 让subject结束
        subject.onCompleted()
         
        // subject完成后会发出.next事件了。
        subject.onNext("444")
         
        // subject完成后它的所有订阅（包括结束后的订阅），都能收到subject的.completed事件，
        subject.subscribe(onNext: { string in
            print("第3次订阅：", string)
        }, onCompleted:{
            print("第3次订阅：onCompleted")
        }).disposed(by: disposeBag)
        
        // 结果：
        // 第1次订阅：222
        // 第1次订阅：333
        // 第2次订阅：333
        // 第1次订阅：onCompleted
        // 第2次订阅：onCompleted
        // 第3次订阅：onCompleted
    }
    
    // 测试BehaviorSubject
    func testBehaviorSubject() {
         
        // 创建一个BehaviorSubject
        let subject = BehaviorSubject(value: "111")
         
        // 第1次订阅subject
        subject.subscribe { event in
            print("第1次订阅：", event)
        }.disposed(by: disposeBag)
         
        // 发送next事件
        subject.onNext("222")
         
        // 发送error事件
        subject.onError(NSError(domain: "local", code: 0, userInfo: nil))
         
        //第2次订阅subject
        subject.subscribe { event in
            print("第2次订阅：", event)
        }.disposed(by: disposeBag)
        
        // result：
        // 第1次订阅：111
        // 第1次订阅：222
        // 第1次订阅：error(Error Domain=local Code=0 "(null)")
        // 第2次订阅：error(Error Domain=local Code=0 "(null)")
    }
    
    // 测试ReplaySubject
    func testReplaySubject() {
         
        // 创建一个bufferSize为2的ReplaySubject
        let subject = ReplaySubject<String>.create(bufferSize: 2)
         
        // 连续发送3个next事件
        subject.onNext("111")
        subject.onNext("222")
        subject.onNext("333")
         
        // 第1次订阅subject
        subject.subscribe { event in
            print("第1次订阅：", event)
        }.disposed(by: disposeBag)
         
        // 再发送1个next事件
        subject.onNext("444")
         
        //第2次订阅subject
        subject.subscribe { event in
            print("第2次订阅：", event)
        }.disposed(by: disposeBag)
         
        //让subject结束
        subject.onCompleted()
         
        //第3次订阅subject
        subject.subscribe { event in
            print("第3次订阅：", event)
        }.disposed(by: disposeBag)
        
        // result:
        // 第1次订阅：222
        // 第1次订阅：333
        // 第1次订阅：444
        // 第2次订阅：333
        // 第2次订阅：444
        // 第1次订阅：completed
        // 第2次订阅：completed
        // 第3次订阅：333
        // 第3次订阅：444
        // 第3次订阅：completed
    }
    
    // 测试Variable
    func testVariable() {
        
        // 创建一个初始值为111的Variable
        let variable = Variable("111")
         
        // 修改value值
        variable.value = "222"
         
        // 第1次订阅
        variable.asObservable().subscribe {
            print("第1次订阅：", $0)
        }.disposed(by: disposeBag)
         
        // 修改value值
        variable.value = "333"
         
        // 第2次订阅
        variable.asObservable().subscribe {
            print("第2次订阅：", $0)
        }.disposed(by: disposeBag)
         
        // 修改value值
        variable.value = "444"
        
        // result:
        // 第1次订阅：222
        // 第1次订阅：333
        // 第2次订阅：333
        // 第1次订阅：444
        // 第2次订阅：444
        // 第1次订阅：completed
        // 第2次订阅：completed
    }
    
    // 测试BehaviorRelay
    func testBehaviorRelay() {
        
        //创建一个初始值为111的BehaviorRelay
        let subject = BehaviorRelay<String>(value: "111")
         
        //修改value值
        subject.accept("222")
         
        //第1次订阅
        subject.asObservable().subscribe {
            print("第1次订阅：", $0)
            }.disposed(by: disposeBag)
         
        //修改value值
        subject.accept("333")
         
        //第2次订阅
        subject.asObservable().subscribe {
            print("第2次订阅：", $0)
            }.disposed(by: disposeBag)
         
        //修改value值
        subject.accept("444")
        
        // result:
        // 第1次订阅：222
        // 第1次订阅：333
        // 第2次订阅：333
        // 第1次订阅：444
        // 第2次订阅：444
        
        // 创建一个初始值为包含一个元素的数组的BehaviorRelay
        let subject2 = BehaviorRelay<[String]>(value: ["1"])
         
        // 修改value值
        subject2.accept(subject2.value + ["2", "3"])
         
        // 第1次订阅
        subject2.asObservable().subscribe {
            print("第1次订阅：", $0)
            }.disposed(by: disposeBag)
         
        // 修改value值
        subject2.accept(subject2.value + ["4", "5"])
         
        // 第2次订阅
        subject2.asObservable().subscribe {
            print("第2次订阅：", $0)
            }.disposed(by: disposeBag)
         
        // 修改value值
        subject2.accept(subject2.value + ["6", "7"])
        
        // result:
        // 第1次订阅：["1","2","3"]
        // 第1次订阅：["1","2","3","4","5"]
        // 第2次订阅：["1","2","3","4","5"]
        // 第1次订阅：["1","2","3","4","5","6","7"]
        // 第2次订阅：["1","2","3","4","5","6","7"]
    }
}
